home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / includes / php-reader / ISO14496.php < prev    next >
PHP Script  |  2010-05-19  |  17KB  |  381 lines

  1. <?php
  2. /**
  3.  * PHP Reader Library
  4.  *
  5.  * Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
  6.  * 
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions are met:
  9.  *
  10.  *   <li>Redistributions of source code must retain the above copyright notice,
  11.  *    this list of conditions and the following disclaimer.
  12.  *   <li>Redistributions in binary form must reproduce the above copyright notice,
  13.  *    this list of conditions and the following disclaimer in the documentation
  14.  *    and/or other materials provided with the distribution.
  15.  *   <li>Neither the name of the project workgroup nor the names of its
  16.  *    contributors may be used to endorse or promote products derived from this
  17.  *    software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  23.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  26.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  27.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  28.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29.  * POSSIBILITY OF SUCH DAMAGE.
  30.  *
  31.  * @package    php-reader
  32.  * @subpackage ISO 14496
  33.  * @copyright  Copyright (c) 2008 PHP Reader Project Workgroup
  34.  * @license    http://code.google.com/p/php-reader/wiki/License New BSD License
  35.  * @version    $Id: ISO14496.php 101 2008-05-13 20:28:13Z svollbehr $
  36.  */
  37.  
  38. /**#@+ @ignore */
  39. require_once("Reader.php");
  40. require_once("ISO14496/Box.php");
  41. /**#@-*/
  42.  
  43. /**
  44.  * This class represents a file in ISO base media file format as described in
  45.  * ISO/IEC 14496 Part 12 standard.
  46.  *
  47.  * The ISO Base Media File Format is designed to contain timed media information
  48.  * for a presentation in a flexible, extensible format that facilitates
  49.  * interchange, management, editing, and presentation of the media. This
  50.  * presentation may be local to the system containing the presentation, or may
  51.  * be via a network or other stream delivery mechanism.
  52.  *
  53.  * The file structure is object-oriented; a file can be decomposed into
  54.  * constituent objects very simply, and the structure of the objects inferred
  55.  * directly from their type. The file format is designed to be independent of
  56.  * any particular network protocol while enabling efficient support for them in
  57.  * general.
  58.  *
  59.  * The ISO Base Media File Format is a base format for media file formats.
  60.  *
  61.  * 
  62.  * An overall view of the normal encapsulation structure is provided in the
  63.  * following table.
  64.  *
  65.  * The table shows those boxes that may occur at the top-level in the left-most
  66.  * column; indentation is used to show possible containment. Thus, for example,
  67.  * a {@link ISO14496_Box_TKHD Track Header Box} is found in a
  68.  * {@link ISO14496_Box_TRAK Track Box}, which is found in a
  69.  * {@link ISO14496_Box_MOOV Movie Box}. Not all boxes need be used in all files;
  70.  * the mandatory boxes are marked with bold typeface. See the description of the
  71.  * individual boxes for a discussion of what must be assumed if the optional
  72.  * boxes are not present.
  73.  *
  74.  * User data objects shall be placed only in {@link ISO14496_Box_MOOV Movie} or
  75.  * {@link ISO14496_Box_TRAK Track Boxes}, and objects using an extended type may
  76.  * be placed in a wide variety of containers, not just the top level.
  77.  *
  78.  * <ul>
  79.  * <li><b>ftyp</b> -- <i>{@link ISO14496_Box_FTYP File Type Box}</i>; file type
  80.  *     and compatibility
  81.  * <li>pdin -- <i>{@link ISO14496_Box_PDIN Progressive Download Information
  82.  *     Box}</i>
  83.  * <li><b>moov</b> -- <i>{@link ISO14496_Box_MOOV Movie Box}</i>; container for
  84.  *     all the metadata
  85.  *   <ul>
  86.  *   <li><b>mvhd</b> -- <i>{@link ISO14496_Box_MVHD Movie Header Box}</i>;
  87.  *       overall declarations
  88.  *   <li><b>trak</b> -- <i>{@link ISO14496_Box_TRAK Track Box}</i>; container
  89.  *       for an individual track or stream
  90.  *     <ul>
  91.  *     <li><b>tkhd</b> -- <i>{@link ISO14496_Box_TKHD Track Header Box}</i>;
  92.  *         overall information about the track
  93.  *     <li>tref -- <i>{@link ISO14496_Box_TREF Track Reference Box}</i>
  94.  *     <li>edts -- <i>{@link ISO14496_Box_EDTS Edit Box}</i>
  95.  *       <ul>
  96.  *       <li>elst -- <i>{@link ISO14496_Box_ELST Edit List Box}</i>
  97.  *       </ul>
  98.  *     <li><b>mdia</b> -- <i>{@link ISO14496_Box_MDIA Media Box}</i>
  99.  *       <ul>
  100.  *       <li><b>mdhd</b> -- <i>{@link ISO14496_Box_MDHD Media Header Box}</i>;
  101.  *           overall information about the media
  102.  *       <li><b>hdlr</b> -- <i>{@link ISO14496_Box_HDLR Handler Reference
  103.  *           Box}</i>; declares the media type
  104.  *       <li><b>minf</b> -- <i>{@link ISO14496_Box_MINF Media Information
  105.  *           Box}</i>
  106.  *         <ul>
  107.  *         <li>vmhd -- <i>{@link ISO14496_Box_VMHD Video Media Header Box}</i>;
  108.  *             overall information (video track only)
  109.  *         <li>smhd -- <i>{@link ISO14496_Box_SMHD Sound Media Header Box}</i>;
  110.  *             overall information (sound track only)
  111.  *         <li>hmhd -- <i>{@link ISO14496_Box_HMHD Hint Media Header Box}</i>;
  112.  *             overall information (hint track only)
  113.  *         <li>nmhd -- <i>{@link ISO14496_Box_NMHD Null Media Header Box}</i>;
  114.  *             overall information (some tracks only)
  115.  *         <li><b>dinf</b> -- <i>{@link ISO14496_Box_DINF Data Information
  116.  *             Box}</i>
  117.  *           <ul>
  118.  *           <li><b>dref</b> -- <i>{@link ISO14496_Box_DREF Data Reference
  119.  *               Box}</i>
  120.  *           </ul>
  121.  *         <li><b>stbl</b> -- <i>{@link ISO14496_Box_STBL Sample Table Box}</i>
  122.  *           <ul>
  123.  *           <li><b>stsd</b> -- <i>{@link ISO14496_Box_STSD Sample Descriptions
  124.  *               Box}</i>
  125.  *           <li><b>stts</b> -- <i>{@link ISO14496_Box_STTS Decoding Time To
  126.  *               Sample Box}</i>
  127.  *           <li>ctts -- <i>{@link ISO14496_Box_CTTS Composition Time To Sample
  128.  *               Box}</i>
  129.  *           <li><b>stsc</b> -- <i>{@link ISO14496_Box_STSC Sample To Chunk
  130.  *               Box}</i>
  131.  *           <li>stsz -- <i>{@link ISO14496_Box_STSZ Sample Size Box}</i>
  132.  *           <li>stz2 -- <i>{@link ISO14496_Box_STZ2 Compact Sample Size
  133.  *               Box}</i>
  134.  *           <li><b>stco</b> -- <i>{@link ISO14496_Box_STCO Chunk Offset
  135.  *               Box}</i>; 32-bit
  136.  *           <li>co64 -- <i>{@link ISO14496_Box_CO64 Chunk Ooffset Box}</i>;
  137.  *               64-bit
  138.  *           <li>stss -- <i>{@link ISO14496_Box_STSS Sync Sample Table Box}</i>
  139.  *           <li>stsh -- <i>{@link ISO14496_Box_STSH Shadow Sync Sample Table
  140.  *               Box}</i>
  141.  *           <li>padb -- <i>{@link ISO14496_Box_PADB Padding Bits Box}</i>
  142.  *           <li>stdp -- <i>{@link ISO14496_Box_STDP Sample Degradation Priority
  143.  *               Box}</i>
  144.  *           <li>sdtp -- <i>{@link ISO14496_Box_SDTP Independent and Disposable
  145.  *               Samples Box}</i>
  146.  *           <li>sbgp -- <i>{@link ISO14496_Box_SBGP Sample To Group Box}</i>
  147.  *           <li>sgpd -- <i>{@link ISO14496_Box_SGPD Sample Group
  148.  *               Description}</i>
  149.  *           <li>subs -- <i>{@link ISO14496_Box_SUBS Sub-Sample Information
  150.  *               Box}</i>
  151.  *           </ul>
  152.  *         </ul>
  153.  *       </ul>
  154.  *     </ul>
  155.  *   <li>mvex -- <i>{@link ISO14496_Box_MVEX Movie Extends Box}</i>
  156.  *     <ul>
  157.  *     <li>mehd -- <i>{@link ISO14496_Box_MEHD Movie Extends Header Box}</i>
  158.  *     <li><b>trex</b> -- <i>{@link ISO14496_Box_TREX Track Extends Box}</i>
  159.  *     </ul>
  160.  *   <li>ipmc -- <i>{@link ISO14496_Box_IPMC IPMP Control Box}</i>
  161.  *   </ul>
  162.  * <li>moof -- <i>{@link ISO14496_Box_MOOF Movie Fragment Box}</i>
  163.  *   <ul>
  164.  *   <li><b>mfhd</b> -- <i>{@link ISO14496_Box_MFHD Movie Fragment Header
  165.  *       Box}</i>
  166.  *   <li>traf -- <i>{@link ISO14496_Box_TRAF Track Fragment Box}</i>
  167.  *     <ul>
  168.  *     <li><b>tfhd</b> -- <i>{@link ISO14496_Box_TFHD Track Fragment Header
  169.  *         Box}</i>
  170.  *     <li>trun -- <i>{@link ISO14496_Box_TRUN Track Fragment Run}</i>
  171.  *     <li>sdtp -- <i>{@link ISO14496_Box_SDTP Independent and Disposable
  172.  *         Samples}</i>
  173.  *     <li>sbgp -- <i>{@link ISO14496_Box_SBGP !SampleToGroup Box}</i>
  174.  *     <li>subs -- <i>{@link ISO14496_Box_SUBS Sub-Sample Information Box}</i>
  175.  *     </ul>
  176.  *   </ul>
  177.  * <li>mfra -- <i>{@link ISO14496_Box_MFRA Movie Fragment Random Access Box}</i>
  178.  *   <ul>
  179.  *   <li>tfra -- <i>{@link ISO14496_Box_TFRA Track Fragment Random Access
  180.  *       Box}</i>
  181.  *   <li><b>mfro</b> -- <i>{@link ISO14496_Box_MFRO Movie Fragment Random Access
  182.  *       Offset Box}</i>
  183.  *   </ul>
  184.  * <li>mdat -- <i>{@link ISO14496_Box_MDAT Media Data Box}</i>
  185.  * <li>free -- <i>{@link ISO14496_Box_FREE Free Space Box}</i>
  186.  * <li>skip -- <i>{@link ISO14496_Box_SKIP Free Space Box}</i>
  187.  *   <ul>
  188.  *   <li>udta -- <i>{@link ISO14496_Box_UDTA User Data Box}</i>
  189.  *     <ul>
  190.  *     <li>cprt -- <i>{@link ISO14496_Box_CPRT Copyright Box}</i>
  191.  *     </ul>
  192.  *   </ul>
  193.  * <li>meta -- <i>{@link ISO14496_Box_META The Meta Box}</i>
  194.  *   <ul>
  195.  *   <li><b>hdlr</b> -- <i>{@link ISO14496_Box_HDLR Handler Reference Box}</i>;
  196.  *       declares the metadata type
  197.  *   <li>dinf -- <i>{@link ISO14496_Box_DINF Data Information Box}</i>
  198.  *     <ul>
  199.  *     <li>dref -- <i>{@link ISO14496_Box_DREF Data Reference Box}</i>; declares
  200.  *         source(s) of metadata items
  201.  *     </ul>
  202.  *   <li>ipmc -- <i>{@link ISO14496_Box_IPMC IPMP Control Box}</i>
  203.  *   <li>iloc -- <i>{@link ISO14496_Box_ILOC Item Location Box}</i>
  204.  *   <li>ipro -- <i>{@link ISO14496_Box_IPRO Item Protection Box}</i>
  205.  *     <ul>
  206.  *     <li>sinf -- <i>{@link ISO14496_Box_SINF Protection Scheme Information
  207.  *         Box}</i>
  208.  *       <ul>
  209.  *       <li>frma -- <i>{@link ISO14496_Box_FRMA Original Format Box}</i>
  210.  *       <li>imif -- <i>{@link ISO14496_Box_IMIF IPMP Information Box}</i>
  211.  *       <li>schm -- <i>{@link ISO14496_Box_SCHM Scheme Type Box}</i>
  212.  *       <li>schi -- <i>{@link ISO14496_Box_SCHI Scheme Information Box}</i>
  213.  *       </ul>
  214.  *     </ul>
  215.  *   <li>iinf -- <i>{@link ISO14496_Box_IINF Item Information Box}</i>
  216.  *     <ul>
  217.  *     <li>infe -- <i>{@link ISO14496_Box_INFE Item Information Entry Box}</i>
  218.  *     </ul>
  219.  *   <li>xml -- <i>{@link ISO14496_Box_XML XML Box}</i>
  220.  *   <li>bxml -- <i>{@link ISO14496_Box_BXML Binary XML Box}</i>
  221.  *   <li>pitm -- <i>{@link ISO14496_Box_PITM Primary Item Reference Box}</i>
  222.  *   </ul>
  223.  * </ul>
  224.  *
  225.  * There are two non-standard extensions to the ISO 14496 standard that add the
  226.  * ability to include file meta information. Both the boxes reside under
  227.  * moov.udta.meta.
  228.  *
  229.  * <ul>
  230.  * <li><i>moov</i> -- <i>{@link ISO14496_Box_MOOV Movie Box}</i>; container for
  231.  *     all the metadata
  232.  * <li><i>udta</i> -- <i>{@link ISO14496_Box_UDTA User Data Box}</i>
  233.  * <li><i>meta</i> -- <i>{@link ISO14496_Box_META The Meta Box}</i>
  234.  *   <ul>
  235.  *   <li>ilst -- <i>{@link ISO14496_Box_ILST The iTunes/iPod Tag Container
  236.  *       Box}</i>
  237.  *   <li>id32 -- <i>{@link ISO14496_Box_ID32 The ID3v2 Box}</i>
  238.  *   </ul>
  239.  * </ul>
  240.  * 
  241.  * @package    php-reader
  242.  * @subpackage ISO 14496
  243.  * @author     Sven Vollbehr <svollbehr@gmail.com>
  244.  * @copyright  Copyright (c) 2008 PHP Reader Project Workgroup
  245.  * @license    http://code.google.com/p/php-reader/wiki/License New BSD License
  246.  * @version    $Rev: 101 $
  247.  */
  248. class ISO14496 extends ISO14496_Box
  249. {
  250.   /** @var string */
  251.   private $_filename;
  252.   
  253.   /**
  254.    * Constructs the ISO14496 class with given file and options.
  255.    *
  256.    * The following options are currently recognized:
  257.    *   o base -- Indicates that only boxes with the given base path are parsed
  258.    *     from the ISO base media file. Parsing all boxes can possibly have a
  259.    *     significant impact on running time. Base path is a list of nested boxes
  260.    *     separated by a dot.
  261.    *   o readonly -- Indicates that the file is read from a temporary location
  262.    *     or another source it cannot be written back to. The use of base option
  263.    *     implies readonly option.
  264.    *
  265.    * @param string $filename The path to the file or file descriptor of an
  266.    *                         opened file.
  267.    * @param Array  $options  The options array.
  268.    */
  269.   public function __construct($filename, $options = array())
  270.   {
  271.     $this->_reader = new Reader($this->_filename = $filename);
  272.     if (isset($options["base"]))
  273.       $options["readonly"] = true;
  274.     $this->setOptions($options);
  275.     $this->setOffset(0);
  276.     $this->setSize($this->_reader->getSize());
  277.     $this->setType("file");
  278.     $this->setContainer(true);
  279.     $this->constructBoxes();
  280.   }
  281.   
  282.   /**
  283.    * Writes the changes back to the original media file.
  284.    *
  285.    * Please note: currently the method writes only ID32 and ILST boxes to
  286.    * <i>moov.udta.meta</i>. Changes to any other box are discarded. Write
  287.    * operation will overwrite <i>moov.udta</i>, if found.
  288.    */
  289.   public function write()
  290.   {
  291.     if (!isset($this->moov->udta->meta->ilst) &&
  292.         !isset($this->moov->udta->meta->id32))
  293.       throw new ISO14496_Exception("Nothing to write");
  294.  
  295.     if ($this->getOption("readonly", false) !== false)
  296.       throw new ISO14496_Exception("File is read only");
  297.     
  298.     if (($fd = fopen($this->_filename, file_exists
  299.                      ($this->_filename) ? "r+b" : "wb")) === false)
  300.       throw new ISO14496_Exception
  301.         ("Unable to open file for writing: " . $filename);
  302.     
  303.     $this->moov->udta->meta->hdlr->setHandlerType("mdir");
  304.     
  305.     /* Calculate start position */
  306.     $mark = ($this->moov->udta->getOffset() > 0 ?
  307.              $this->moov->udta->getOffset() :
  308.              $this->moov->getOffset() + $this->moov->getSize());
  309.     
  310.     /* Calculate file size */
  311.     fseek($fd, 0, SEEK_END);
  312.     $oldFileSize = ftell($fd);
  313.     $newFileSize = $oldFileSize -
  314.       ($this->moov->udta->getOffset() > 0 ? $this->moov->udta->getSize() : 0) -
  315.       (isset($this->moov->udta->meta->free) ?
  316.        $this->moov->udta->meta->free->getSize() : 0) +
  317.       strlen($this->moov->udta);
  318.  
  319.     /* Calculate free space size */
  320.     if ($oldFileSize < $newFileSize) {
  321.       // Add free space to the file calculated using the following logaritmic
  322.       // equation: log(0.2(x + 10)), ranging from 1k to 9k given the file size
  323.       // of 0..4G
  324.       $this->moov->udta->meta->free->setSize
  325.         (ceil(log(0.2 * ($newFileSize / 1024 + 10), 10) * 1024));
  326.       ftruncate($fd, $newFileSize += $this->moov->udta->meta->free->getSize());
  327.       
  328.       // Move data to the end of the file
  329.       for ($i = 1, $cur = $oldFileSize; $cur > $mark; $cur -= 1024, $i++) {
  330.         fseek($fd, -(($i * 1024) +
  331.               ($excess = $cur - 1024 > $mark ? 0 : $cur - $mark - 1024) +
  332.               ($newFileSize - $oldFileSize)), SEEK_END);
  333.         $buffer = fread($fd, 1024);
  334.         fseek($fd, -(($i * 1024) + $excess), SEEK_END);
  335.         fwrite($fd, $buffer, 1024);
  336.       }
  337.       
  338.       // Update stco/co64 to correspond the data move
  339.       foreach ($this->moov->getBoxesByIdentifier("trak") as $trak) {
  340.         $chunkOffsetBox = 
  341.           (isset($trak->mdia->minf->stbl->stco) ?
  342.            $trak->mdia->minf->stbl->stco : $trak->mdia->minf->stbl->co64);
  343.         $chunkOffsetTable = $chunkOffsetBox->getChunkOffsetTable();
  344.         $chunkOffsetTableCount = count($chunkOffsetTable);
  345.         $chunkOffsetDelta = $newFileSize - $oldFileSize;
  346.         for ($i = 1; $i <= $chunkOffsetTableCount; $i++)
  347.           $chunkOffsetTable[$i] += $chunkOffsetDelta;
  348.         $chunkOffsetBox->setChunkOffsetTable($chunkOffsetTable);
  349.         fseek($fd, $chunkOffsetBox->getOffset());
  350.         fwrite($fd, $chunkOffsetBox, $chunkOffsetBox->getSize());
  351.       }
  352.     } 
  353.     else
  354.       $this->moov->udta->meta->free->setSize($oldFileSize - $newFileSize);
  355.     
  356.     /* Update the target box */
  357.     fseek($fd, $mark);
  358.     $this->moov->udta->setSize(fwrite($fd, $this->moov->udta));
  359.     
  360.     /* Update the parent box */
  361.     fseek($fd, $this->moov->getOffset());
  362.     fwrite($fd, Transform::toUInt32BE($this->moov->getSize()));
  363.     
  364.     fclose($fd);
  365.   }
  366.   
  367.   /**
  368.    * Returns the raw data of the ISO14496 file.
  369.    *
  370.    * @return string
  371.    */
  372.   public function __toString($data = "")
  373.   {
  374.     if ($this->isContainer())
  375.       foreach ($this->getBoxes() as $name => $boxes)
  376.         foreach ($boxes as $box)
  377.           $data .= $box;
  378.     return $data;
  379.   }
  380. }
  381.